#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//
//using namespace std;
//const int N = 1e5 + 10;
//int q[N];
//int n;
//int main()
//{
//    cin >> n;
//    int mi;
//    bool flag = true;
//    cin >> q[0];
//    while (!(q[0] % 2) || !(q[0] % 3))
//    {
//        if (!(q[0] % 2))
//            q[0] /= 2;
//        if (!(q[0]) % 3)
//            q[0] /= 3;
//    }
//    mi = q[0];
//    for (int i = 1; i < n; i++)
//    {
//        cin >> q[i];
//        while (!(q[i] % 2) || !(q[i] % 3))
//        {
//            if (!(q[i] % 2))
//                q[i] /= 2;
//            if (!(q[i]) % 3)
//                q[i] /= 3;
//        }
//        if (mi != q[i])
//        {
//            cout << "No" << endl;
//            flag = false;
//            break;
//        }
//    }
//    if (flag)
//        cout << "Yes";
//    return 0;
//}
//#include<iostream>
//#include<unordered_set>
//using namespace std;
//const int N = 400003;
//int n, k;
//int main()
//{
//    bool flag = true;
//    for (int i = 400000;; i++)
//    {
//        flag = true;
//        for (int j = 2; j * j < i; i++)
//            if (i % j == 0)
//            {
//                flag = false;
//                break;
//            }
//        if (flag)
//        {
//            cout << i;
//            break;
//        }
//    }
//    return 0;
//}
//#include<iostream>
//#include <cstring>
//using namespace std;
//const int N = 400009, null = 0x3f3f3f3f;
//int n, k;
//int h[N];
//int q[N], w[N];
//bool st[N];
//int find(int x)
//{
//    int t = x % N;
//    while (h[t] != x && h[t] != null)
//    {
//        t++;
//        if (t == N) t = 0;
//    }
//    return t;
//}
//int main()
//{
//    memset(h, -1, sizeof h);
//    cin >> n >> k;
//    int num = 0;
//    for (int i = 0, t; i < n; i++)
//    {
//        cin >> t;
//        q[i] = t;
//        int f = find(t);
//        h[f] = t;
//        w[f]++;
//    }
//    for (int i = 0; i < n; i++)
//    {
//        int y = find(q[i] * k);
//        int z = find(y * k);
//        if (h[y] != null && h[z] != null)
//        {
//            num += w[y] * w[z];
//        }
//    }
//    cout << num;
//    return 0;
//}
#include<iostream>
#include <cstring>
using namespace std;
const int N = 400009, null = 0x3f3f3f3f;
int n, k;
int h[N];
int q[N], w[N];
bool st[N];
int find(int x)
{
    int t = x % N;
    while (h[t] != x && h[t] != null)
    {
        t++;
        if (t == N) t = 0;
    }
    return t;
}
int main()
{
    memset(h, 0x3f, sizeof h);
    cin >> n >> k;
    int num = 0;
    for (int i = 0, t; i < n; i++)
    {
        cin >> t;
        q[i] = t;
        int f = find(t);
        h[f] = t;
        w[f]++;
    }
    for (int i = 0; i < n; i++)
    {
        int y = find(q[i] * k);
        int z = find(k * q[i] * k);
        if (h[y] != null && h[z] != null && !st[find(q[i])])
        {
            if (k == 1)
            {
                int t = w[y] - 2;
                int sum = 1;
                while (t)
                {
                    sum *= t--;
                }
                num += sum;
            }
            else
            {
                num += w[find(q[i])] * w[y] * w[z];
            }
        }
        st[find(q[i])] = true;
    }
    cout << num;
    return 0;
}